package dbhelp

import (
	"gorm.io/gorm"
	"gorm.io/gorm/clause"
)

// UpdateSafe 使用非主键执行更新操作
// 特别注意：执行大量的删除动作时，很容易损坏表，造成错误trace err:Error 1034 (HY000): Incorrect key file for table
func UpdateSafe(execSql string) (err error) {
	err = DB.Transaction(func(tx *gorm.DB) error {
		if err = tx.Exec("SET SQL_SAFE_UPDATES = 0").Error; err != nil {
			return err
		}
		if err = tx.Exec(execSql).Error; err != nil {
			return err
		}
		//返回nil事务
		return nil
	})
	return
}

// Save 保存struct数据，没有主键则创建数据，有主键则更新所有字段
// 避免Gorm Save主键冲突｜Duplicate entry ‘xxxx‘ for key ‘PRIMARY
func Save(value interface{}) error {
	return DB.Clauses(clause.OnConflict{UpdateAll: true}).Create(value).Error
}

//SET SQL_BIG_SELECTS = 1    sql超过长度使用

// Upsert 执行update insert操作，有则更新，没有则创建
func Upsert(priKey, upKey []string, data any) error {
	var priColumn []clause.Column
	for _, v := range priKey {
		priColumn = append(priColumn, clause.Column{Name: v})
	}
	return DB.Clauses(clause.OnConflict{
		Columns:   priColumn,                       //指定唯一索引或主键列
		DoUpdates: clause.AssignmentColumns(upKey), // 指定要更新的列
	}).Create(data).Error
}

// TableExist 检查mysql数据库表是否存在
func TableExist(schema, tableName string) (has bool, err error) {
	var count int64
	err = DB.Raw(`select count(*) from information_schema.tables where table_schema=? and table_name=?`, schema, tableName).
		Scan(&count).Error
	return count != 0, err
}

// SchemaName 获取数据库名
func SchemaName(db *gorm.DB) (name string, err error) {
	err = db.Raw("SELECT DATABASE()").Scan(&name).Error
	return
}
